package primeraEntregaMain

import scala.collection.mutable.Buffer
import scala.collection.mutable.Map
import excepciones.UsuarioYaExisteException
import excepciones.PasswordInvalidoException
import excepciones.UsuarioNoValidadoException
import excepciones.NoExisteUsuarioException
import excepciones.ValidacionException
import aerolineasYVuelos.Aerolinea
import aerolineasYVuelos._
import javax.persistence.Entity
import javax.persistence.OneToMany
import java.util.Date
import javax.persistence.GeneratedValue
import javax.persistence.Id
import javax.persistence.GenerationType
import scala.collection.JavaConverters._
import servicios.ServicioUsuario
import servicios.ServicioAerolinea
import servicios.ServicioVuelo
import servicios.ServicioAsiento
import excepciones.AsientoReservadoException
import servicios.ServicioTramo
import servicios.ServicioReserva

object Sistema {
  
//	def getUsuarios { ServicioUsuario.todosLosUsuarios.asScala.toBuffer[Usuario] }
//	def setUsuarios(us :java.util.List[Usuario]) { usuarios = us}
	
//	def getAerolineas { ServicioAerolinea.todasLasAerolineas }
//	def setAerolineas(as :java.util.List[Aerolinea]) { aerolineas = as }
  
	/**
	 * Agrega un usuario a la lista de usuariosValidados.
	 */
	def agregarUsuario(usuario :Usuario) = ServicioUsuario.agregarUsuario(usuario)
  
	/**
	 * Devuelve true si el usuario esta en el hash de usuariosPorValidar.
	 */
	def usuarioExistente(nombreDeUsuario :String) :Boolean = ServicioUsuario.usuarioExistente(nombreDeUsuario)
	
	/**
	 * Para verificar si dos claves son iguales
	 */
	def esLaMismaClave (password1 :String, password2 :String) : Boolean = password1.matches(password2)
	
	/**
	 * Devuelve true si la contrasenia pasada como parametro es
	 * igual a la contrasenia del usuario.
	 */
	def contraseniaCorrecta(nombreDeUsuario :String, contrasenia :String) :Boolean = esLaMismaClave(dameUsuario(nombreDeUsuario).getPassword, contrasenia)
	
	/**
	 * Devuelve el usuario de la lista que se corresponde con el nombre
	 */
	def dameUsuario (nomUser :String) : Usuario = ServicioUsuario.dameUsuario(nomUser)

	/**
	 * Si el usuario existe lanza una excepcion,
	 * sino lo agrega en el hash de usuariosPorValidar
	 */
	def registrarUsuario(nombre: String, apellido: String, nombreDeUsuario: String,
		  			email: String, fechaDeNacimiento: Date, password: String, validado: Boolean) = { 
	  if(usuarioExistente(nombreDeUsuario)) {
	  	throw new UsuarioYaExisteException
	  } else {
	    var usuario = new Usuario
	    usuario.inicializarUsuario(nombre, apellido, nombreDeUsuario, email, fechaDeNacimiento, password, validado)
	    ServicioUsuario.crearUsuario(nombre, apellido, nombreDeUsuario, email, fechaDeNacimiento, password, validado)
	  }
	}
	
	/**
	 * Si el usuario no existe en la lista de usuarios validados o si existe y
	 * la contrasenia es incorrecta, lanza una excepcion.
	 */
	def ingresarUsuario(nombreDeUsuario :String, contrasenia :String) :Boolean = {
	  if(!(usuarioExistente(nombreDeUsuario) && contraseniaCorrecta(nombreDeUsuario, contrasenia)))
	    throw new NoExisteUsuarioException
	  else
	    true
	}
	
	/**
	 *  Si es la misma clave la vieja y la nueva lanza excepcion
	 *  si no busca al usuario con el nombre y le dice q cambie su clave
	 */ 
	def cambiarPassword (userName :String, password :String , nuevoPass :String) = {
		if(usuarioExistente(userName))
			if(esLaMismaClave (password, nuevoPass))
				throw new PasswordInvalidoException
			else
				ServicioUsuario.cambiarPassword(userName, nuevoPass)
		else
			throw new UsuarioNoValidadoException
	 }
	
//	/**
//	 * Verifica si el sistema trabaja con la aerolinea pasada por parametro
//	 * si es asi le pide a la aerolinea reservar los asientos, sino tira una excepcion
//	 */
//	def reservarAsientos(asientos: Buffer[Asiento], usuario:Usuario) {
//
//		if(asientos.exists(_.estaReservado)) {
//		  throw new AsientoReservadoException
//		} else {
//		  ServicioReserva.reservarAsiento(asientos, usuario)
//		}
//		
//	}
	
//	/**
//	 *  Devuelve una lista con todos los asientos disponibles para una aerolinea en un vuelo
//	 *  en un tramo
//	 */	
//	def consultarAsientosLibres(tramo: Tramo) {
//		ServicioTramo.consultarAsientosLibres(tramo)
//	}

}